package com.yesep.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.yesep.common.service.RpcCommonService;
import com.yesep.constant.Constants;
import com.yesep.model.*;
import com.yesep.service.IDataMessageService;
import com.yesep.service.IDataTextService;
import com.yesep.service.IEnvPolluteFactorService;
import com.yesep.service.IEnvSiteService;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

public class DataManager {


    private static final Logger log = Logger.getLogger(DataManager.class);


    public static IDataMessageService getDataMessageService() {
        return (IDataMessageService) SpringUtil.getBean("iDataMessageService");
    }

    public static IEnvSiteService getEnvSiteService() {
        return (IEnvSiteService) SpringUtil.getBean("iEnvSiteService");
    }

    public static IDataTextService getDataTextService() {
        return (IDataTextService) SpringUtil.getBean("iDataTextService");
    }
    public static IEnvPolluteFactorService getEnvPolluteFactorService() {
        return (IEnvPolluteFactorService) SpringUtil.getBean("iEnvPolluteFactorService");
    }

    /**
     * 校验报文格式
     *
     * @param messageBaseModel
     * @return
     */
    public static DataText parseDataMessage(MessageBaseModel messageBaseModel) {
        DataText dataText = new DataText();
        dataText.setClientIp(messageBaseModel.getIp());
        dataText.setDtType(Constants.DATA_TEXT_TYPE_UP);
        dataText.setServerIp(Constants.LOCAL_IP);
        dataText.setDtCreateTime(new Date());
        dataText.setDtContent(messageBaseModel.getMessage());
        dataText.setDtStatus(Constants.DATA_TEXT_STATUS_SUCCESS);


        if (!Objects.equals(messageBaseModel.getErrorMessage(), null)) {
            dataText.setDtDesc("报文解析失败," + messageBaseModel.getErrorMessage() + "!");
            dataText.setDtStatus(Constants.DATA_TEXT_STATUS_FAILED);
        }

        if (Objects.equals(messageBaseModel.getMN(), null)) {
            dataText.setDtStatus(Constants.DATA_TEXT_STATUS_FAILED);
            dataText.setDtDesc("报文解析失败,MN为空!");
        }

        if (Objects.equals(messageBaseModel.getST(), null)) {
            dataText.setDtStatus(Constants.DATA_TEXT_STATUS_FAILED);
            dataText.setDtDesc("报文解析失败,ST为空!");
        }

        if (Objects.equals(messageBaseModel.getPW(), null)) {
            dataText.setDtStatus(Constants.DATA_TEXT_STATUS_FAILED);
            dataText.setDtDesc("报文解析失败,PW为空!");
        }

        if (Objects.equals(messageBaseModel.getCN(), null)) {
            dataText.setDtStatus(Constants.DATA_TEXT_STATUS_FAILED);
            dataText.setDtDesc("报文解析失败,CN为空!");
        }


        //数据文本状态没问题
        if (Objects.equals(dataText.getDtStatus(), Constants.DATA_TEXT_STATUS_SUCCESS)) {
            EnvSite site = new EnvSite();
            site.setSiteCode(messageBaseModel.getMN());
            //查询站点
            EnvSite envSite = DataManager.getEnvSiteService().getObj(site);

            //站点为空
            if (Objects.equals(envSite, null)) {
                dataText.setDtDesc("查找不到相关站点,请确认MN[" + messageBaseModel.getMN() + "] 是否配置成功");
                dataText.setDtStatus(Constants.DATA_TEXT_STATUS_FAILED);
            } else {
                messageBaseModel.setSiteId(envSite.getSiteId());
                dataText.setSiteId(messageBaseModel.getSiteId());
                dataText.setDtStatus(Constants.DATA_TEXT_STATUS_SUCCESS);
            }
            try {
                //持久化数据报文
                DataManager.getDataMessageService().insert(messageBaseModel);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }

        return dataText;
    }

    public static DataText parseReceiveMessage(String socketAddress, String sendMessage, MessageBaseModel messageBaseModel) {
        DataText dataText = new DataText();
        dataText.setClientIp(socketAddress);
        dataText.setDtType(Constants.DATA_TEXT_TYPE_UP);

        dataText.setServerIp(Constants.LOCAL_IP);
        dataText.setDtCreateTime(new Date());
        dataText.setDtContent(sendMessage);

        if (!Objects.equals(messageBaseModel.getErrorMessage(), null)) {
            dataText.setDtDesc("报文解析失败," + messageBaseModel.getErrorMessage() + "!");
            dataText.setDtStatus(Constants.DATA_TEXT_STATUS_FAILED);
            //持久化操作
            return dataText;
        } else if (!Objects.equals(messageBaseModel.getMN(), null)) {
            dataText.setDtStatus("报文解析失败,MN为空!");
            dataText.setDtStatus(Constants.DATA_TEXT_STATUS_FAILED);
            //持久化操作
            return dataText;
        } else if (!Objects.equals(messageBaseModel.getST(), null)) {
            dataText.setDtStatus("报文解析失败,ST为空!");
            dataText.setDtStatus(Constants.DATA_TEXT_STATUS_FAILED);
            //持久化操作
            return dataText;
        } else if (!Objects.equals(messageBaseModel.getPW(), null)) {
            dataText.setDtStatus("报文解析失败,PW为空!");
            dataText.setDtStatus(Constants.DATA_TEXT_STATUS_FAILED);
            //持久化操作
            return dataText;
        } else if (!Objects.equals(messageBaseModel.getCN(), null)) {
            dataText.setDtStatus("报文解析失败,CN为空!");
            dataText.setDtStatus(Constants.DATA_TEXT_STATUS_FAILED);
            //持久化操作
            return dataText;
        } else {
            DataParse dataParse = new DataParse();
            dataParse.setQn(messageBaseModel.getQN());
            dataParse.setMn(messageBaseModel.getMN());
            dataParse.setPno(messageBaseModel.getPNO());
            dataParse.setPnum(messageBaseModel.getPNUM());
            dataParse.setSt(messageBaseModel.getST());
            dataParse.setCn(messageBaseModel.getCN());
            dataParse.setPw(messageBaseModel.getPW());
            dataParse.setFlag(messageBaseModel.getFlag());
            dataParse.setCp(messageBaseModel.getCP().toString());

            //根据MN设备唯一编号查询数据库
            EnvSite site = new EnvSite();
            site.setSiteCode(messageBaseModel.getMN());
            EnvSite envSite = DataManager.getEnvSiteService().getObj(site);

            if (Objects.equals(envSite, null)) {
                dataText.setDtDesc("查找不到相关站点,请确认MN[" + messageBaseModel.getMN() + "] 是否配置成功");
                dataText.setDtStatus(Constants.DATA_TEXT_STATUS_FAILED);
                //持久化dataText


                dataParse.setDtId(dataText.getDtId());
                //持久化dataParse

            } else {
                dataText.setSiteId(envSite.getSiteId());
                dataText.setDtStatus(Constants.DATA_TEXT_STATUS_SUCCESS);

                //持久化dataText

                dataParse.setDtId(dataText.getDtId());
                dataParse.setSiteId(dataText.getSiteId());

                //持久化dataParse

//                dataText.setParam3(messageBaseModel.getMN());

            }
            return dataText;

        }

    }

    public static DataText saveSendMessage(String hostAddress, String sendMessage, MessageBaseModel cmdMessageBaseModel, String status, String desc) {
        DataText dataText = new DataText();
        dataText.setClientIp(hostAddress);
        dataText.setDtDesc(desc);
        dataText.setDtType(Constants.DATA_TEXT_TYPE_UP);
        dataText.setServerIp(Constants.LOCAL_IP);
        dataText.setDtCreateTime(new Date());
        dataText.setDtContent(sendMessage);

        //报文持久化
        return dataText;
    }


    //
////	public synchronized static void addSiteModelForCache(SiteModel site) {
////		SysCacheUtils.addSiteModel(site);
////	}
////
////	public static SiteModel getSiteModelFromCache(String mn) {
////		return SysCacheUtils.getSiteModel(mn);
////	}
////
////	public static SiteModel getSiteModelFromCacheByHost(String host) {
////		return SysCacheUtils.getSiteModelByHost(host);
////	}
////
////	public static SiteModel getSiteModelFromCache(Integer id) {
////		return SysCacheUtils.getSiteModel(id);
////	}
////
////	public static List<SiteModel> getSiteModelsFromCache() {
////		return SysCacheUtils.getSiteModels();
////	}
//
//	/**
//	 * 环境标准
//	 *
//	 * @param id
//	 * @return
//	 */
//	public static EnvStandard getEnvStandardFromCache(Integer id) {
//		return SysCacheUtils.getEnvStandard(id);
//	}
//
//	/**
//	 * 根据标准的应用场景，得到所有此范围的环境标准
//	 *
//	 * @param scope
//	 * @return
//	 */
//	public static List<EnvStandard> getEnvStandardsFromCache(String scope) {
//		return SysCacheUtils.getEnvStandards(scope);
//	}
//
//	/**
//	 * 从缓存中获取状态码
//	 *
//	 * @param factorId
//	 *            因子ID
//	 * @param flagCode
//	 *            状态码
//	 * @return
//	 */
//	public static EnvFactorFlag getEnvFactorFlagFromCache(Integer factorId,
//			String flagCode) {
//		return SysCacheUtils.getEnvFactorFlag(factorId, flagCode);
//	}
//
//	/**
//	 * 是否在线
//	 *
//	 * @param mn
//	 *            站点编号
//	 * @return 是否在线
//	 */
//	public static boolean online(String mn) {
//		SiteModel siteModel = getSiteModelFromCache(mn);
//		if (null == siteModel)
//			return false;
//		return siteModel.online();
//	}
//
//	/**
//	 * 返回站点在线状态样式
//	 *
//	 * @param mn
//	 *            站点编号
//	 * @return 返回站点在线状态样式
//	 */
//	public static String onlineCls(String mn) {
//		if (online(mn)) {
//			return Constants.SITE_ONLINE_CLS;
//		} else {
//			return Constants.SITE_OFFLINE_CLS;
//		}
//	}
//
//	/**
//	 * 转化状态码为中文
//	 *
//	 * @param list
//	 */
//	public static void setDataFactorFlag(List list,String factorType) {
//		for (Object obj : list) {
//			Class<? extends Object> cls = obj.getClass();
//
//			Class[] paramCls = new Class[] { String.class };
//			List<EnvFactor> factors = SysCacheUtils.getEnvFactors(factorType);
//			for (EnvFactor f : factors) {
//				String fcol = "F" + f.getFactorColumn();
//				String val = (String) ReflectUtils.invoke(obj, "get" + fcol,
//						null, null);
//				if (null != val && !"".equals(val)) {
//					EnvFactorFlag flag = SysCacheUtils.getEnvFactorFlag(
//							f.getFactorId(), val);
//					if (null == flag)
//						continue;
//					ReflectUtils.invoke(obj, "set" + fcol, paramCls,
//							new String[] { flag.getFlagName() });
//				}
//			}
//
//		}
//	}
//
//	public static List<DataWarn> setDataFactorFlagWarn(DataFactorBase entity,String factorType) {
//		List<DataWarn> warnList=new ArrayList<DataWarn>();
//		SiteModel siteModel = DataManager.getSiteModelFromCache(entity.getSiteId());
//		List<EnvSiteFactor> siteFactorList = siteModel.getEnvSiteFactors(factorType);
//		DataWarnManager mgr = DataManager.getDataWarnManager();
//		Date date = DateUtils.getDate();
//		for (EnvSiteFactor f : siteFactorList) {
//			String fcol = "F" + f.getFactorColumn();
//			String val = (String) ReflectUtils.invoke(entity, "get" + fcol,
//					null, null);
//			if (null != val && !"".equals(val)) {
//				EnvFactorFlag flag = SysCacheUtils.getEnvFactorFlag(
//						f.getFactorId(), val);
//				if (null == flag)
//					continue;
//				String level = null;
//				if (flag.getFlagType().equals("02")) {
//					level = "01";
//				} else if (flag.getFlagType().equals("03")) {
//					level = "03";
//				}
//				if (null != level) {
//					DataWarn dataWarn = new DataWarn();
//					dataWarn.setSiteId(siteModel.getSiteId());
//					dataWarn.setFactorId(f.getFactorId());
//					dataWarn.setFactorVal(val);
//					dataWarn.setWarnTime(date);
//					dataWarn.setWarnType(Constants.FACTOR_TYPE_WQ.equals(factorType)?"02":"04");// 水质设备预警/动环设备预警
//					dataWarn.setWarnStatus("01");
//					dataWarn.setParam1(flag.getFlagName());
//					dataWarn.setWarnContent("设备[" + f.getFactorName() + "] 状态预警[" + flag.getFlagName() + "]");
//					dataWarn.setWarnLevel(level);// 预警级别
//					mgr.save(dataWarn);
//					warnList.add(dataWarn);
//				}
//			}
//		}
//		return warnList;
//	}
//
//	public static Map getRealtimeBySiteMap(Integer siteId) {
//		return getRealtimeBySiteMap(getSiteModelFromCache(siteId));
//	}
//
//	public static Map getRealtimeBySiteMap(SiteModel site) {
//		Integer siteId = site.getSiteId();
//		Map map = new HashMap();
//		List<Map> result = new ArrayList();
//		DataFactorRtdManager rtdMgr = getDataFactorRtdManager();
//		DataRealtimeRtd rtd = rtdMgr.getRealtimeBySite(siteId);
//		map.put("dataRealtimeRtd", rtd);
//		site = getSiteModelFromCache(siteId);
//		List<EnvSiteFactor> factors = site
//				.getEnvSiteFactorsShow(Constants.FACTOR_TYPE_WQ);
//		if (null != rtd) {
//			DataFactorRtdStatus status = getDataFactorRtdStatusManager()
//					.getStatusByRtd(rtd.getDataId(), rtd.getDataCn());
//			setRtdStatusStrandard(status);
//			map.put("dataFactorRtdStatus", status);
//			for (EnvSiteFactor f : factors) {
//				String fcol = "F" + f.getFactorColumn();
//				String fun = "get" + fcol;
//				Double val = (Double) ReflectUtils.invoke(rtd, fun, null, null);
//				Map m = new HashMap();
//				m.put("factor", f);
//				m.put("factorVal", val);
//				m.put("factorStatus",
//						null == status ? "04" : StringUtils.trim(
//								ReflectUtils.invoke(status, fun, null, null),
//								"04"));// 指标状态
//				m.put("factorStandard", rtdMgr.getEnvStandardByFactor(siteId, f.getFactorId(), val));
//				result.add(m);
//			}
//		}
//		map.put("results", result);
//		return map;
//	}
//
//	public static void setRtdStatus(DataFactorRtd rtd) {
//		DataFactorRtdStatus status = rtd.getStatus();
//		if (null == status) {
//			if (null != rtd.getDataId()) {
//				status = getDataFactorRtdStatusManager().getStatusByRtd(
//						rtd.getDataId(), rtd.getDataCn());
//				rtd.setStatus(status);
//			}
//		}
//		setRtdStatusStrandard(status);
//	}
//
//	public static void setRtdStatusStrandard(DataFactorRtdStatus status) {
//		if (null != status) {
//			Integer stardId = status.getStandardId();
//			if (null != stardId) {
//				EnvStandard stard = DataManager.getEnvStandardFromCache(stardId);
//				status.addAttr("envStandard", stard);
//				if (null != stard) {
//					status.addAttr("standardName", stard.getStandardName());
//					status.addAttr("standardColor", stard.getStandardColor());
//				}
//			}
//		}
//	}
//
//	public static Map<Integer, Double> getFactorMap(DataFactorRtd rtd) {
//		Map<Integer, Double> factorMap = new HashMap<Integer, Double>();
//		List<EnvSiteFactor> siteFactorList = null;
//		String rtdCn = StringUtils.trim(rtd.getDataCn());
//		SiteModel siteModel = DataManager.getSiteModelFromCache(rtd.getSiteId());
//		if (null == siteModel) {
//			return factorMap;
//		}
//		String warnType = "01";// 水质数据预警
//		if ("2081".equals(rtdCn)) {// 动环数据预警
//			warnType = "03";
//			siteFactorList = siteModel
//					.getEnvSiteFactors(com.yjkj.envm.Constants.FACTOR_TYPE_DE);// 取得相关的站点动环监测指标
//		} else {// 2051
//			if ("22".equals(rtd.getDataSt())) {
//				siteFactorList = siteModel
//						.getEnvSiteFactors(com.yjkj.envm.Constants.FACTOR_TYPE_WQ);// 取得相关的站点水质监测指标
//			} else {
//				// siteFactorList = siteModel
//				// .getEnvSiteFactors(com.yjkj.envm.Constants.FACTOR_TYPE_AIR);//
//				// 取得相关的站点空气监测指标
//				siteFactorList = siteModel
//						.getEnvSiteFactors(com.yjkj.envm.Constants.FACTOR_TYPE_WQ);
//			}
//		}
//		// Class[] paramCls = new Class[] { String.class };
//		for (int i = 0; i < siteFactorList.size(); i++) {// 各个监控指标状态
//			EnvSiteFactor factor = siteFactorList.get(i);
//			Integer factorId = factor.getFactorId();
//			String column = "F" + factor.getFactorColumn();
//			Double factorVal = (Double) ReflectUtils.invoke(rtd,
//					"get" + column, null, null);
//			factorMap.put(factorId, factorVal);
//		}
//		return factorMap;
//	}
//
//	/**
//	 * 获取相应小数位的数值，直接截断，不四舍五入
//	 *
//	 * @param val
//	 *            原始值
//	 * @param digits
//	 *            小数位
//	 * @return
//	 */
//	public static double getDoubleVal(double val, int digits) {
//		BigDecimal bg = new BigDecimal(Double.toString(val));
//		double res = bg.setScale(digits, BigDecimal.ROUND_DOWN).doubleValue();
//		return res;
//	}
//
//
//
//	/**
//	 * 添加选中站点
//	 *
//	 * @param sid
//	 * @param request
//	 * @return
//	 */
//	public static List<Integer> addCurrentSite(Integer sid,
//			HttpServletRequest request) {
//		List<Integer> list = getCurrentSite(request);
//		if (null != sid && !list.contains(sid)) {
//			list.add(sid);
//		}
//		return list;
//	}
//
//	/**
//	 * 获取选中站点
//	 *
//	 * @param request
//	 * @return
//	 */
//	public static List<Integer> getCurrentSite(HttpServletRequest request) {
//		HttpSession s = request.getSession();
//		List<Integer> list = (List<Integer>) s
//				.getAttribute(Constants.CURRENT_SITE_KEY);
//		if (null == list) {
//			list = new ArrayList<Integer>();
//			s.setAttribute(Constants.CURRENT_SITE_KEY, list);
//		}
//		return list;
//	}
//	/**
//	 * 获取默认选中站点，（默认最后选中的）
//	 *
//	 * @param request
//	 * @return
//	 */
//	public static Integer getDefaultSite(HttpServletRequest request) {
//		Integer sid = null;
//		List<Integer> list = getCurrentSite(request);
//		if (list.size() > 0) {
//			sid = list.get(list.size() - 1);
//		} else {
//			sid = EnvHelper.getEnvSiteManager().getDefaultSiteId(
//					SessionUserUtils.getUserId(request));
//			if (null != sid) {
//				addCurrentSite(sid, request);
//			}
//		}
//		return sid;
//	}
//
//	public static void setEnvFactorListModel(HttpServletRequest request,
//                                             String key, String factorType, String dataShow, boolean multiple) {
//		List list = null;
//		if (!multiple) {// 单选
//			Integer defaultId = getDefaultSite(request);
//			if (null != defaultId) {
//				list = setEnvFactorListModelBySite(request, defaultId, key,
//						factorType, dataShow);
//			}
//		} else {// 多选
//			List<Integer> sites = getCurrentSite(request);
//			if (null != sites || sites.size() > 0) {
//				if (sites.size() == 1) {
//					list = setEnvFactorListModelBySite(request, sites.get(0),
//							key, factorType, dataShow);
//				}
//			}
//		}
//		if (null == list || list.size() < 1) {
//			request.setAttribute(key, SysCacheUtils.getEnvFactorsShow(factorType));
//		}
//	}
//
//	public static List<EnvSiteFactor> setEnvFactorListModelBySite(HttpServletRequest request, Integer siteId, String key, String factorType, String dataShow) {
//		SiteModel site = getSiteModelFromCache(siteId);
//		List<EnvSiteFactor> list = site.getEnvSiteFactors();
//		list = EnvHelper.getEnvSiteFactorsByType(list,
//				factorType, dataShow);
//		request.setAttribute(key, list);
//		return list;
//	}
//	//是否有效的环境标准(ID在缓存中)
//	public static boolean isValidStandard(Integer standardId){
//		EnvStandard st = SysCacheUtils.getEnvStandard(standardId);
//		return null!=st;
//	}
//
//	public static void main(String[] args) {
//		System.out.println(getDoubleVal(0.049112121, 3));
//	}
}
